"use strict";
/**
 * 装饰器 本质要做的是 操作原型链的操作 所以我们实际上是可以定义多个装饰
 *  比如 多个装饰器修饰同一个类
 */
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
    var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
    if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
    else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
    return c > 3 && r && Object.defineProperty(target, key, r), r;
};
{
    const moveDecorators = (target) => {
        target.prototype.getPosotion = () => {
            return { x: 100, y: 200 };
        };
    };
    const musicDecorators = (target) => {
        target.prototype.play = () => {
            console.log('播放音乐');
        };
    };
    let Tank = class Tank {
    };
    Tank = __decorate([
        moveDecorators,
        musicDecorators
    ], Tank);
    let t1 = new Tank();
    console.log(t1.getPosotion()) //  { x: 100, y: 200 }
    ;
    t1.play(); // 播放音乐
    /**
     * 以上例子可见 Tank类被两个类装饰器装饰
     *  叠加装饰 任然是可以使用的
     *
     *  原理也很简单 这两个装饰器都是去Tank原型链上添加方法  t1找属性和方法都会攀升原型链去找对应的属性和方法
     *  所以本质上只要两个装饰器处理的原型属性和方法不重复 都可以一直装饰下去
     */
}
